# -*- coding: utf-8 -*-

"""
1. 建立一个栈来存储待计算的操作数；
2. 遍历字符串，遇到操作数则压入栈中，遇到操作符号则出栈操作数(n次)，进行相应的计算，计算结果是新的操作数压回栈中，等待计算
3. 按上述过程，遍历完整个表达式，栈中只剩下最终结果；
"""

operators = {
    '+': lambda op1, op2: op1 + op2,
    '-': lambda op1, op2: op1 - op2,
    '*': lambda op1, op2: op1 * op2,
    '/': lambda op1, op2: op1 / op2
}


def eval_postfix(expr):
    """
    :param expr # 后缀表达式
    :return # 正常情况下栈内的第一个元素就是计算好之后的值
    """
    # 把传过来的后缀表达式切分成列表
    tokens = expr.split()
    stack = []
    # 迭代列表中的元素
    for token in tokens:
        # 如果当前元素是数字
        if token.isdigit():
            # 就追加到栈里边
            stack.append(int(token))
        # 如果当前元素是操作符
        elif token in operators.keys():
            # 获取运算符操作表中对应的lambda表达式
            f = operators[token]
            # 根据先进后出的原则，先让第二个元素出栈
            op2 = stack.pop()
            # 在让第一个元素出栈
            op1 = stack.pop()
            # 把计算的结果在放入到栈内
            stack.append(f(op1, op2))
    return stack.pop()


result = eval_postfix('2 3 4 * +')
print(result)
